package src

import (
	"fmt"
	"reflect"
	"strings"
	"unsafe"
)

// 1.18 新特性 strings和bytes包的Clone方法，旨在优化字符串和字符切片的复制
// 此前，复制可能设计不必要的内存共享和潜在问题
// 新特性通过高效的复制避免了这些问题，提供了一种更安全、简洁的方式来创建字符串副本

// copy [复制会共享内存]
func Copy() {
	s0 := "1234"
	s1 := s0[:3]
	s0h := (*reflect.StringHeader)(unsafe.Pointer(&s0))
	s1h := (*reflect.StringHeader)(unsafe.Pointer(&s1))

	fmt.Printf("Len is equal: %t\n", s0h.Len == s1h.Len)
	fmt.Printf("Data is equal: %t\n", s0h.Data == s1h.Data)

	/*
		type StringHeader struct {
			Data uintptr		// 指向具体的底层数组
			Len int				// 代表字符串切片的长度
		}
		关键在于Data，本质上是一个指向底层数据的指针地址，因此在复制时，会将其也复制过去。造成不必要的复制和 “脏” 数据，引发各种奇怪的 bug
	*/
}

// 新特性
func Clone() {
	/*
		func Clone(s string) string {
			if len(s) == 0 {
				return ""
			}
			b := make([]byte, len(s))
			copy(b, s)
			return *(string)(unsafe.Pointer(&b))
		}

		通过 copy 函数对原始字符串进行复制，得到一份新的[]byte数据
		通过 *(string)(unsafe.Pointer(&b)) 进行指针操作，实现byte到string的零内存复制转换
	*/
	var s = "你好啊贷记卡打开"
	b := strings.Clone(s)
	fmt.Printf("%v\t", &s)
	fmt.Printf("%v\t", &b)
}
